ν΄μ κ΄λ ¨ μ 리
hash
μμ μΆ©λ λ°©μ§ μ μ±
μ μ€μνλ€. κ°μ₯ κ°λ¨νκ²λ μ΄λ―Έ μ¬μ©μ€μΈ μμμ λ§λ¬μ λ μ£Όμκ°μ +1
νλ Open Addressing
μ Linear Probing
λ°©μμ΄ λνμ μ΄μ§λ§, μ¬κΈ°μλ Chaining
λ°©μμ ꡬνμ μμλ³΄κ² λ€. Chaining
λ°©μμ κ²½μ° κ° μμ λ μν νκ² ν μ μμ΄ μ’ λ μΆμ²λλ€. (Open Addressing
μ μμ κ° μ’ κΉλ€λ‘λ€. κ·Έλ₯ isDeleted λμ
νλκ±° λ§κ³ λ..)
idκ° sparseνκ² μ°μΌ λ μ¬μ©. 본격μ μΈ hash
ꡬν μ΄μ μ νλ² κ΅¬νν΄λ³΄λ©΄ μ’λ€. μ¬μ€ hash
μ κ΄κ±΄μ key
κ° μμ±μ μλλ°, μ΄ κ²½μ° λ¨μν val % HMAX
λ‘ key
κ°μ μ‘μΌλ©΄ μΆ©λΆνλ€. λ¬Όλ‘ μ
μμ μΌλ‘ valueλ₯Ό μμ±ν μλ μκΈ΄ νλ€. μ΄λ₯Ό λ§κΈ° μν΄μλ bucket
μ νμ©ν΄μΌ ν κ²μ΄λ€. bucket
μ νμ©ν μΌλ°μ μΈ κ΅¬νμ μλμ²λΌ λλ€.
#define HMAX 10007 // μμκ° μ’λ€.struct Node {int idx;T val;Node* next;};Node npool[1'000'000];int nidx;Node* newNode() {npool[nidx].next = nullptr;return &npool[nidx++];}struct Hash {Node* head[HMAX];Hash() {for(int i = 0; i < HMAX; ++i) {head[i] = newNode();}}int getKey(int idx) {return idx % HMAX;}void set(int idx, T val) {Node* p = head[getKey(idx)];for(;p->next != 0; p = p->next) {if (p->next->idx == idx) {p->next->val = val;return;}}p->next = newNode();p->next->idx = idx;p->next->val = val;}void insert(int idx, T val) {// μ€λ³΅κ°μ΄ νμ€ν μμμ μ λNode* p = head[getKey(idx)];Node* opnext = p->next;p->next = newNode();p->next->idx = idx;p->next->val = val;p->next->next = opnext;}T get(int idx) {Node* p = head[getKey(idx)];for(;p->next != 0; p = p->next) {if (p->next->idx == idx) {return p->next->val;}}}};
μ£Όλ‘ hash
λΌκ³ λ§νλ©΄, λ³΄ν΅ string
μ key
λ‘ κ°λ hash
λ₯Ό μλ―Ένλ κ²½μ°κ° λ§λ€. μ΄ κ²½μ°, μ¬μ€ key
κ°μ λ§λλ λ‘μ§μ μ μΈνλ©΄ λ‘μ§μ μμ κ°λ€. μ΄λ° key
κ°μ ν¨μ¨μ μΌλ‘, λΉ λ₯΄κ² λ§λλ κ²μ΄ μ£Όμνλ°, λ§μ½ string
μ μ΅λ κΈΈμ΄κ° 8λ³΄λ€ μλ€κ³ νλ©΄, μλ λ°©λ²λ μ ν¨νλ€. (κ°λ ₯ μΆμ²)
int getKey(char d[]) {char buf[8] = {0, };for(int i = 0; d[i] != 0 && i < 8; ++i) {buf[i] = d[i];}return (*(unsigned long long *) buf) % HMAX;}
μ λ°©μμ μΌμ’
μ νΈλ¦μΌλ‘, char λ°°μ΄μ ullλ‘ μμ¬μ κ³μ°νλ€. λ§μ½ d[]
κ° λ¬΄μ‘°κ±΄ 8μ리λ‘λ§ μ¨λ€λ©΄, λ³΅μ¬ κ³Όμ νμμμ΄ λ°λ‘ μ¬μ©ν΄λ λλ€.
μΌλ°μ μΌλ‘ κΈ΄ λ¬Έμμ΄μ΄ key
κ°μ μ°μΈλ€λ©΄, λΉνΈμ°μ°μ μ μ ν νμ©ν΄μ κ° μ리 λ§λ€ *33
μ λμ κ°μ κ³±ν΄μ λν΄μ μ°κ³€ νλ€. μ΄ κ²½μ° *33
μ (h<<5 + h)
λ‘ μΉνμ΄ κ°λ₯νλ―λ‘, μλμ²λΌ μΈ μ μλ€.
int getKey(char d[]) {int hashKey = 5381;for(char* p = d; *p != 0; ++p) {hashKey = ((hashKey) << 5) + hashKey + (*p);hashKey %= HMAX;}return hashKey;}
μ²μ hashKey
λ₯Ό μ΄κΈ°ν νλ κ²μ μμ§ λ§μ.
vector
λ₯Ό νμ©νλ©΄ μλ³΄λ€ ν¨μ¬ μ½κ² ꡬνλ κ°λ₯νλ€. (μΆμ²)
#define HMAX 10007 // μμκ° μ’λ€.struct Node {int idx;T val;};int nidx;struct Hash {vector<Node> data[HMAX];Hash() { init(); }void init() {for(int i = 0; i < HMAX; ++i) data[i].clear();}int getKey(int idx) {return idx % HMAX;}void set(int idx, T val) {if (getIdx(idx) == -1) insert(idx, val);else data[getKey(idx)][getIdx(idx)] = {idx, val};}void insert(int idx, T val) { // μ€λ³΅ keyκ°μ΄ νμ€ν μμμ μ λdata[getKey(idx)].push_back({idx, val});}int getIdx(int idx) {int i = 0;for(auto& item: data[getKey(idx)]) {if (item.idx == idx) return i;++i;}return -1; // not found}};